package chatBot.config;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.*;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;


import java.util.List;

@Slf4j
@Configuration
@EnableSwagger2
@EnableKnife4j
public class WebMvcConfig extends WebMvcConfigurationSupport {

    /**
     * 配置消息转换器，用于处理HTTP请求和响应中的消息转换。
     * 在此配置中，重写了Jackson转换器，将Long类型转换为String类型，
     * 以解决前端在处理Long类型时出现的精度丢失问题。
     *
     * @param converters 转换器列表
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("扩展消息转换器~~~");
        //创建消息转换器
        MappingJackson2HttpMessageConverter mj2 = new MappingJackson2HttpMessageConverter();
        //设置对象转换器
        mj2.setObjectMapper(new JacksonObjectMapper());

        //将上述消息转换器对象追加到转换容器（convertor）当中
        converters.add(0,mj2);
    }

    /**
     * 配置静态资源映射，用于指定URL路径与实际静态资源之间的映射关系。
     *
     * @param registry 资源处理器注册表
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
        log.info("开始静态资源映射~~~");
        // 映射Swagger文档路径
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    /**
     * 创建用于生成Swagger API文档的Docket Bean。
     *
     * @return Docket实例
     */
    @Bean
    public Docket createRestApi() {
        // 配置文档类型为Swagger 2
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                // 设置API扫描的包路径
                .apis(RequestHandlerSelectors.basePackage("chatBot.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 配置Swagger API文档的基本信息，包括标题、版本和描述。
     *
     * @return ApiInfo实例
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("chatBot接口文档") // 文档标题
                .version("1.0") // 文档版本
                .description("chatBot接口文档") // 文档描述
                .build();
    }



}
